package com.tqz.juc.aqs;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * {@link CountDownLatch} 可以规定所有线程同时执行。
 * 它是一次性的，也就是只能使用一次，不能重复使用。
 * 实现了AQS的共享模式，允许多个线程共享锁状态。
 *
 * <p>应用场景：百米赛跑、并行任务同步、多任务汇总、资源初始化。
 *
 * @author tianqingzhao
 * @since 2022/2/5 18:23
 */
public class CountDownLatchTest1 {

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(3);
        final CountDownLatch latch = new CountDownLatch(3);
        for (int i = 0; i < 3; i++) {
            Runnable runnable = () -> {
                try {
                    System.out.println("子线程" + Thread.currentThread().getName() + "开始执行");
                    Thread.sleep(2000);
                    System.out.println("子线程" + Thread.currentThread().getName() + "执行完成");
                    //当前线程调用此方法，则计数减一
                    latch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            service.execute(runnable);
        }

        try {
            System.out.println("主线程" + Thread.currentThread().getName() + "等待子线程执行完成...");
            //阻塞当前线程，直到计数器的值为0
            latch.await();
            System.out.println("主线程" + Thread.currentThread().getName() + "开始执行...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        service.shutdown();
    }

}
